AWS Clean Roomsで簡単かつ安全に、加工済みデータをアカウント間連携してみた!
データアナリティクス事業本部の鈴木です。
今年3月にAWS Clean RoomsがGAになりましたが、改めて一般提供版で使い方を確認してみたのでまとめました。
この記事で確認している内容は、基本的にはパブリックプレビュー時期に以下の記事で確認したものと同じです。プレビュー版で試した際の操作と大きな違いは特になかったため、プレビュー版で検証されていた方は同じように使って頂けると思います。
AWS Clean Roomsとは?
AWSにアクセスできる他の企業のメンバーとコラボレーションして、顧客データの分析を行うことができるサービスです。安全なデータ連携のためのデータクリーンルームを、わずかな時間で簡単に構築できます。
コラボレーションするAWSアカウントはAWS Clean Roomsのコラボレーションにて指定できます。コラボレーションには、どのようなクエリを許可するかという分析ルールを設定したテーブルを関連付け、アカウントを跨ぎつつもデータ取得を制御したデータ連携が可能になります。
検証した仕組みの全体像
今回検証してみた仕組みに登場する要素を整理してみました。
※ 図は整理用に私が作成しただけなので、もし不正確なところがあればご容赦ください。
事前に用意しておいた以下の2アカウントで検証しました。
- データのプロデューサーのアカウント
- データのコンシューマーのアカウント
プロデューサーのアカウントではS3バケットにデータを用意し、Glueテーブルを作成しておきました。AWS Clean Roomsでコンシューマーのアカウントとのコラボレーションを作成し、分析ルールも設定したテーブルを関連付けました。コンシューマーのアカウントからコラボレーションに参加し、AWS Clean Roomsのコンソールから検索できるか確認しました。
後ほど2つのアカウントのコンソールで実際に操作をしていきますが、ライトモードの画面がプロデューサーのアカウント、ダークモードの画面がコンシューマーのアカウントです。
各アカウントのコラボレーションメンバー用のIAMロールについては開発者ガイドの以下の項目に記載がありますが、今回は事前に準備した十分な権限があるロールで試しました。
- Create an IAM role for a collaboration member
- Create an IAM role for a member who can query and receive results
検証手順の紹介
開発者ガイドに記載があるAWS Clean Roomsのセットアップ例の手順を参考に進めました。
今回は以下の手順で進めました。
- プロデューサーのアカウントで、AWS Clean Rooms用のサービスロールを作成する。
- プロデューサーのアカウントで、コラボレーションを作成する。
- プロデューサーのアカウントで、クエリするデータテーブルを準備する。
- プロデューサーのアカウントで、設定したテーブルへの分析ルールを設定する。
- プロデューサーのアカウントで、設定したテーブルをコラボレーションに関連付ける。
- コンシューマーのアカウントで、メンバーシップを作成し、コラボレーションに参加する。
- コンシューマーのアカウントで、クエリを発行し、データを取得する。
AWSへのサインアップなど一部手順はスキップしています。
やってみる
手順1: AWS Clean Rooms用のサービスロールを作成する
まずAWS Clean Rooms用のサービスロールを作成しました。必要な権限は、開発者ガイドの『Create a service role for AWS Clean Rooms』に記載があるので、これを参考にしました。
以下のCloudFormationテンプレートを実行し、IAMロールを作成しました。
AWSTemplateFormatVersion: "2010-09-09" Description: Creating Service Role for Clean Rooms Parameters: S3BucketName: Description: Bucket Name for Target Data. Type: String S3Prefix: Description: Prefix for Target Data Under S3 Bucket. Type: String GlueDatabaseName: Description: Glue Database for Target Data. Type: String GlueTableName: Description: Glue Table for Target Data. Type: String Resources: IAMRoleForCleanRoomsService: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Sid: RoleTrustPolicyForCleanRoomsService Effect: Allow Principal: Service: cleanrooms.amazonaws.com Action: "sts:AssumeRole" Path: "/" Policies: - PolicyName: CleanRoomsServicePolicy PolicyDocument: Version: "2012-10-17" Statement: - Sid: NecessaryGluePermissions Effect: "Allow" Action: [ "glue:GetDatabase", "glue:GetDatabases", "glue:GetTable", "glue:GetTables", "glue:GetPartition", "glue:GetPartitions", "glue:BatchGetPartition" ] Resource: [ !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:database/${GlueDatabaseName}", !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:table/${GlueDatabaseName}/${GlueTableName}", !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:catalog" ] - Sid: NecessaryS3BucketPermissions Effect: "Allow" Action: [ "s3:GetBucketLocation", "s3:ListBucket" ] Resource: [ !Sub "arn:aws:s3:::${S3BucketName}" ] Condition: StringEquals: 's3:ResourceAccount': [ !Sub "${AWS::AccountId}" ] - Sid: NecessaryS3ObjectPermissions Effect: "Allow" Action: [ "s3:GetObject" ] Resource: [ !Sub "arn:aws:s3:::${S3BucketName}/${S3Prefix}/*" ] Condition: StringEquals: 's3:ResourceAccount': [ !Sub "${AWS::AccountId}" ]
S3バケットおよびGlueの設定についてはパラメータで渡せるようにしています。S3バケット名とプレフィクスは、分析対象のデータがあるところを指定しました。Glueデータベースとテーブルは、そのデータを検索できるようにあらかじめデータベースとテーブルを作成しておき、その名前を入力しました。
なお、今回は以前執筆した『AWS Glue Data Quality(プレビュー) をAWS Glueコンソールから試してみよう!』で利用したテーブルを流用しました。このテーブルにはUCI Machine Learning RepositoryのIris Data Setのデータ(4KB程度)が入っています。
データは下記のリンクで提供されています。
- https://archive.ics.uci.edu/ml/datasets/iris
手順2: コラボレーションを作成する
コラボレーションを作成します。まず、AWS Clean Roomsのコンソールでコラボレーション
を押します。
コラボレーション画面でコラボレーションを作成
を押します。
コラボレーションを作成
画面で、名前・説明を入力しました。
また、自アカウントを含むメンバー表示名の設定とメンバー追加を行いました。今回はデータコンシューマー1としてコンシューマーのアカウントを設定しました。これはメンバー2の欄のメンバーAWSアカウントID
に該当するAWSアカウントIDを入力することで設定ができます。(記事ではセキュリティ上、見えないように加工しています。)
メンバー能力の欄では、クエリを実行して結果を受け取ることができるメンバーを指定できます。メンバー2のアカウントでデータを取得できるようにしたいので、データコンシューマー1を設定しておきます。
クエリログ記録・暗号コンピューティング・コラボレーションタグは設定せずに進みました。
メンバーシップを設定
でどのタイミングでコラボレーションに参加できるか選べました。今回ははい、今すぐメンバーシップを作成してご加入ください
を選びました。
確認と作成
で入力内容を確認した後、コラボレーションが作成されました。
手順3: クエリするデータテーブルを準備する
次にクエリするデータテーブルを準備していきます。これはGlueデータカタログのテーブルをAWS Clean Roomsに登録するような作業になります。先に記載の通り、今回はGlueデータカタログに既にテーブルを作成している前提で記載します。
AWS Clean Roomsのコンソールで、設定済みのテーブル
をクリックし、新しいテーブルを設定
を押します。
新しいテーブルを設定画面で、設定したいAWS Glueテーブルを選び、コラボレーションで検索を許可する列を指定します。コラボレーションで検索を許可する列
欄ではカスタムリスト
を選べば検索を許可するカラムを指定できるようですが、今回はあまり気にせずすべての列
を選んでみました。
問題なければ新しいテーブルを設定
を押し、以下のように設定ができました。
次に、赤枠箇所から、分析ルールを設定します。
手順4: テーブルへの分析ルールを設定する
検索ができるよう、テーブルへ分析ルールを設定します。手順3で引き続き、分析ルールを設定
を押します。
ステップ1でタイプを選択します。今回は集約関数なしで弾かれるかみてみたかったので集約
を選択しました。作成方法はガイドフロー
を選びました。JSONエディタ
を選ぶと、JSONファイルで設定を読み込むこともできるようでした。
ステップ2のクエリコントロールを指定
画面では、クエリで許可する細かな操作について設定できました。
ステップ3のクエリ結果コントロールを指定
画面では、クエリ結果が返却される条件について設定できました。
ステップ4で設定を確認し、分析ルールの設定を完了します。
続いて赤枠箇所から、コラボレーションへの関連づけを行います。
手順5: 設定したテーブルをコラボレーションに関連付ける
設定したテーブルをコラボレーションに関連付けます。手順4に引き続き、テーブルを関連付ける
を押します。
関連づけるテーブルを選択し、サービスアクセスに手順1で作成したサービスロールを選択しました。
テーブルを関連付ける
をクリックして作業を完了しました。
コラボレーションの画面から確認すると、以下のように関連付けができました。
手順6: メンバーシップを作成し、コラボレーションに参加する
ここからはコンシューマーのアカウントでの操作です。プロデューサーのアカウントで作成され招待されたコラボレーションに参加します。
コラボレーション
から参加可能
タブを開き、招待されたコラボレーションを開きました。
招待されたコラボレーションの画面から、メンバーシップを作成
を押しました。
招待の内容に間違いがないか確認のポップアップが出るので、内容を確認し、メンバーシップを作成
を押してコラボレーションに参加しました。
これでコラボレーションに参加し、データを検索できるようになりました。
手順7: クエリを発行し、データを取得する
クエリエディタから検索をしてみます。
結果の保存設定
最初に、検索結果を保存する場所の設定をする必要があります。
クエリエディタの右上のアクション
から結果設定を設定
を押しました。
S3の送信先を設定し、保存のフォーマットを選択し、保存しました。
フォーマットは記事執筆時点でCSVとParquetが選択できました。特にParquetは、後続のAthenaなどで検索する際に便利なので非常に助かります。
成功するパターン
今回は手順5でAVG
関数による集約を許可しているので、まずは試してみました。
以下のSQLをクエリエディタから実行しました。
select AVG(sepal_length) as sepal_length_avg, AVG(sepal_width) as sepal_width_avg, AVG(petal_length) as petal_length_avg, AVG(petal_width) as petal_width_avg, class from iris_quality_check group by class
無事結果が取得できましたが、Parquetを指定したからか結果のプレビューはできませんでした。
クエリ結果設定で、結果フォーマットをCSVにしてもう一度実行すると、今度はプレビューが表示されました。
やはり初回実行時はクエリの実行にしばらく時間がかかるようでした。2回目以降はそうでもありませんでした。
失敗するパターン
分析ルールに沿わないので失敗が期待されるSQLも実行してみました。
以下のように集約しないままSELECTするSQLを実行すると、指定したカラムはSELECTが許可されていない旨のエラーが出て確かに失敗しました。
select distinct sepal_length from iris_quality_check
リソースの削除
一通り確認したいことが検証できたので、削除についても確認しました。
以下のリソースを削除していきました。
- コンシューマーのアカウントのメンバーシップ
- プロデューサーのアカウントのコラボレーション
- プロデューサーのアカウントの設定済みテーブル
- プロデューサーのアカウントのサービスロールのCloudFormationスタック
コンシューマー側のアカウントのメンバーシップは、コラボレーションの画面のアクション
からメンバーシップを削除
で削除できました。
コラボレーションは、プロデューサー側のアカウントのコラボレーションの画面のアクション
からコラボレーションを削除
で削除できました。
削除したコラボレーションは、プロデューサー側のアカウントの利用できなくなりました
タブから確認できました。
テーブルも設定済みのテーブルから削除したいテーブルを開き、削除
から削除できました。
最後に
今回はAWS Clean Roomsの基本的な操作内容を紹介しました。
ドキュメントやコンソールにとても丁寧に情報が記載されており、ほとんど詰まることなくあっという間にコラボレーションを設定することができました。製品ページでも数分で作成できることを謳っていますが、まさにその通りだなと驚きました。
検索結果はCSVだけではなくParquetでも保存でき、後続にAthenaなどの検索機能を配置して使うようなユースケースに気を配っている点もとても良いところでした。
今回は分析ルールはざっくりと設定してしまいましたが、細かく設定ができる点も大きなポイントかと思います。
プレビュー時点でも非常に完成度が高いUIだなと思っていましたが、一般提供版はさらに一部UIに改善が入った印象でした。とはいえ操作はほぼプレビュー版と同じだったので、プレビュー版でいろいろ試行錯誤されていた方はそのまま使って頂けると思います。
また、クエリの画面で一部写っていましたが、Analysis Builderのような追加機能も提供されており、SQLを使わないユーザーに対しても使ってもらいやすいよう工夫がされておりとても良かったです。この機能については『AWS Clean RoomsのAnalysis Builderを使ってみた』でご紹介しました。このような機能改善がどんどん追加されているのもとてもいいですね。